<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>复习</title>
</head>
<body>
    <script>
        // Symbol 独一无二的值
        // 应用 就是给对象添加独一无二的属性
        //      班级同学的名字，可能有重复的，Symbol('张三')
        // Symbol魔术方法 [Symbol.iterator] 可迭代协议 for.of循环

        // 迭代器协议
        // [Symbol.iterator]:function(){
        //     return {
        //         next:()=>{
        //             return {value:'xxx', done:boolean}  true 到最后
        //         }
        //     }
        // }

        // Array     Set       Object      Map
        //  有序     无序       无序        有序
        //          元素唯一    键值对       键值对
        //       new Set(arr)  obj.key      m.get('key')
        //       [...set]      obj['key']

        //           add                    set
        //           has                    has
        //           delete                 delete
        //           size                   size
        //           clear                  clear
        //                                  get
        // console.time('标识字符串');
        // //代码
        // console.timeEnd('标识字符串');

        // 对象的扩展
        // Object.is(NaN,NaN); // NaN === NaN
        // 对象合并，浅拷贝
        // Object.assign(obj,obj1,obj2,obj3)
        // 浅拷贝 和 深拷贝
        // 1 深拷贝 obj  JSON.stringify  -> jsonstr
        //         jsonstr   JSON.parse  -> obj
        //    function

        // let obj = {
        //     name:'yuonly',
        //     say:function(){
        //         console.log(123);
        //     },
        //     address:{
        //         city:'beijing'
        //     }
        // }

        // let jsonstr = JSON.stringify(obj);
        // let newObj = JSON.parse(jsonstr);
        // newObj.address.city = '上海';
        // console.log(newObj,obj);

        // 递归深拷贝

        // 直接取值
        // console.log(typeof 1);//number
        // console.log(typeof '1');//string
        // console.log(typeof undefined);//undefined
        // console.log(typeof true);//boolean
        // console.log(typeof null);// object

        // // 先创建 容器，在递归深拷贝
        // console.log(typeof []);  //object
        // console.log(typeof {});  //object
        
        let s = Symbol('褚瑞');

        let obj = {
            name:'yuonly',
            say:function(){
                console.log(123);
            },
            classmates:[
                {n:'韩展宇',age:19}
            ],
            address:{
                city:'beijing'
            }
        }

        Object.defineProperties(obj,{
            [s]:{
                value:'褚瑞',
                enumerable:true
            }
        })
        
        function deepClone(obj){
            if(typeof obj !== 'object' || obj === null){
                return obj;
            }
            let result = obj instanceof Array ? [] : {}
            // 要么是数组，要么是对象 for in 循环遍历
            for(let attr in obj){
                //result['name'] = deepClone(obj['name']) deepClone('yuonly')
                result[attr] = deepClone(obj[attr]);
            }
            return result;
        }

        let newObj = deepClone(obj);
        newObj.address.city = '深圳';
        console.log(newObj, obj);
    </script>
</body>
</html>